//
//  HMEmoticonManager.swift
//  68.新工程-表情键盘_界面搭建
//
//  Created by shenzhenIOS on 16/4/20.
//  Copyright © 2016年 shenzhenIOS. All rights reserved.
//

import UIKit

/// 一页显示20个表情模型
let HMEmoticonNumberOfPage = 20

/// 一页7列
let HMEmoticonColumnOfPage = 7

/// 一页3行
let HMEmoticonRowOfPage = 3

// bundle的路径
let EmoticonsBundlePath = NSBundle.mainBundle().pathForResource("Emoticons", ofType: "bundle")!

/// 处理(加载/保存)表情模型和表情包模型
class HMEmoticonManager: NSObject {
    static let sharedManager: HMEmoticonManager = HMEmoticonManager()
    
    private let emoticonPath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! + "/emoticons.plist"
    
    /// 外界通过这个属性来访问 所有表情包, 只会加载一次
    lazy var packageModels: [HMEmoticonPackageModel] = self.loadPackages()
    
    /// 表情包模型是从bundle里面加载出来的,bundle是在磁盘上.如果多次加载是比较耗性能,而且bundle加载出来是不会变,只需要加载一次
    /// 加载所有表情包
    private func loadPackages() -> [HMEmoticonPackageModel] {
        // 加载最近表情包, 默认表情包里面没有表情,是一个空数组
        let recentPackage = HMEmoticonPackageModel(id: "", group_name_cn: "最近", emoticons: loadRecentEmoticns())
        
        let defaultPackage = loadPackage("com.sina.default")
        let emojiPackage = loadPackage("com.apple.emoji")
        let lxhPackage = loadPackage("com.sina.lxh")
        
        return [recentPackage, defaultPackage, emojiPackage, lxhPackage]
    }
    
    /// 加载表情包
    ///
    /// - parameter id: 表情包文件夹名称
    /// 返回表情包模型
    private func loadPackage(id: String) -> HMEmoticonPackageModel {
        // 解析id文件夹下的info.plist
        // info.plist的路径 = Emoticons.bundle的路径/id/info.plist
//        print("EmoticonsBundlePath: \(EmoticonsBundlePath)")
        let infoPath = EmoticonsBundlePath + "/" + id + "/" + "info.plist"
//        print("infoPath: \(infoPath)")
        
        let infoDict = NSDictionary(contentsOfFile: infoPath)!
        
//        print("info的内容: \(infoDict)")
        // 解析内容
        /// 表情包名称
        let group_name_cn = infoDict["group_name_cn"] as! String
        
        var emoitcons = [HMEmoticonModel]()
        
        /// 表情数组里面存放的是字典
        if let emoticonsArray = infoDict["emoticons"] as? [[String: String]] {
            //遍历数组,获取里面的字典,字典转模型
            for dict in emoticonsArray {
                // 表情字典转表情模型
                let model = HMEmoticonModel(dict: dict, id: id)
                emoitcons.append(model)
            }
        }
        
        // 创建表情包
        return HMEmoticonPackageModel(id: id, group_name_cn: group_name_cn, emoticons: emoitcons)
    }
    
    /// 添加最近表情
    func addRecentEmoticon(emoticon: HMEmoticonModel) {
        // 获取 最近 这页的表情
        var recentPageEmoticons = packageModels[0].pageEmoticons[0]
        
        // 记录相同的表情
        var sameEmoticon: HMEmoticonModel? = nil
        
        // 判断是否存在一样的表情
        for e in recentPageEmoticons {
            // 获取现有的表情,判断是否是同一个表情
            if (emoticon.emoji != nil && emoticon.code == e.code) || (emoticon.chs != nil && emoticon.chs == e.chs) {
                sameEmoticon = e
            }
        }

        // 如果存在一样的表情先删除
        if sameEmoticon != nil {
            // 找到相同表情的index
            let index = recentPageEmoticons.indexOf(sameEmoticon!)
            recentPageEmoticons.removeAtIndex(index!)
//            print("删除相同表情: \(sameEmoticon)")
        }
        
        // 将模型添加到数组的最前面
        recentPageEmoticons.insert(emoticon, atIndex: 0)
        
        // 如果表情数量超过20,删除后面的表情
        while recentPageEmoticons.count > 20 {
            recentPageEmoticons.removeLast()
        }
        
        // swift中数组和OC的不一样, 值传递,会复制元素
        // 需要再次赋值回去
        packageModels[0].pageEmoticons[0] = recentPageEmoticons
        
        // 保存到本地
        saveRecentEmoticons()
//        print("recentPageEmoticons: \(recentPageEmoticons)")
//        print("packageModels[0].pageEmoticons[0]: \(packageModels[0].pageEmoticons[0])")
    }
    
    /// 保存表情
    private func saveRecentEmoticons() {
//        print("emoticonPath: \(emoticonPath)")
        NSKeyedArchiver.archiveRootObject(packageModels[0].pageEmoticons[0], toFile: emoticonPath)
    }
    
    /// 加载最近表情
    private func loadRecentEmoticns() -> [HMEmoticonModel] {
        if let emoticons = NSKeyedUnarchiver.unarchiveObjectWithFile(emoticonPath) as? [HMEmoticonModel] {
//            print("加载到了表情: \(emoticons)")
            return emoticons
        } else {
            // 没加载到返回空数组
            return [HMEmoticonModel]()
        }
    }
}
